package com.guochao.myRPCversion3.common;


import lombok.Builder;
import lombok.Data;

import java.io.Serializable;

/**
 * 在上个例子中，Client仅仅只发送了一个id参数过去，这显然是不合理的。
 * 因为服务端不会只有一个服务一个方法，因此只传递参数服务端不会知道调用那个方法。
 *
 * 因此一个RPC请求中，client发送的信息应该要包含调用的Service接口名，方法名，参数，参数类型这些详细信息。
 * 所以我们封装一个RPCRequest类，这个类就包含了所要调用方法的详细信息，然后向server发送一个实例对象，
 * 这样服务端就能根据这些信息根据反射调用相应的方法。
 *
 * 使用java自带的序列化方式将RPCRequest对象序列化（实现接口）
 */
@Data
@Builder
public class RPCRequest implements Serializable {
    /**
     * 既然client要通过接口名，方法名等详细信息请求调用server中对应的方法，
     * 那么客户端就必须得事先知道server提供了哪些Service（这就是微服务中对外暴露的服务接口），
     * client不要知道server具体是怎么实现这些service的，只需要明白自己需要哪些调用哪些server服务，
     * 然后通过提供的服务接口进行远程调用就可以了。
     * eg:
     * public interface UserService {
     *
     *     User getUserByUserId(Integer id);
     *
     * }
     */
    // 服务类名，客户端只知道接口名，在服务端中用接口名指向实现类  eg:UserService
    private String interfaceName;
    // 方法名  eg: getUserByUserId
    private String methodName;
    // 参数列表  eg: 1
    private Object[] params;
    // 参数类型   eg:Integer.class
    private Class<?>[] paramsTypes;
}
